package Common_String_API;
//String 的注意事项

public class test2 {
    public static void main(String[] args) {
        // 1.String的对象是不可边字符串对象
        // 这边name改变的原理是在内存中产生新的字符串再赋给name,之前的字符串没有改变
        String name = "黑马";
        name += "程序员";
        System.out.println(name);
        name = "高手";
        System.out.println(name);

        System.out.println("====================");

        // 2.只要以""给的字符串对象,存储再常量池中,而且相同时只会存储一份
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1 == s2);
        System.out.println(s1);
        System.out.println(s2);

        System.out.println("====================");

        // 3.new String 创建字符串对象,每次new出来的都是一个新对象,放在堆内存中
        char[] arr = {'a','b','c'};
        String a1 = new String("abc");
        String a2 = new String("abc");
        String a3 = new String(arr);//这个会先把arr数组转化为"abc"
        System.out.println(a1 == a2);
        System.out.println(a1 == a3);
        System.out.println(a2 == a3);

        System.out.println("====================");

        //(一些经典的面试题)
        String c1 = "abc";
        String c2 = "ab";//这个不会发生编译优化机制
        String c3 = s2 + "c";//这个会参与运算,放在堆内存运算为"abc",而c1放在常量池
        System.out.println(c1 == c3);//false

        String d1 = "abc";
        String d2 = "a" + "b" + "c";//因为Java存在编译优化机制,程序在编译时,"a"+"b"+"c"会直接转化为"abc",以提高程序性能
        System.out.println(d1 == d2);//true

    }
}
